/*
 * @Author: new-wang
 * @Date: 2025-05-09 14:53:11
 * @LastEditors: new-wang
 * @LastEditTime: 2025-05-09 16:49:19
 * @FilePath: \v3bbs\src\utils\axios-req.ts
 * @Description:对axios请求进行封装
 */
import axios from "axios";
import type { AxiosRequestConfig, InternalAxiosRequestConfig, AxiosResponse } from "axios";
import { useBasicStore } from "@/stores/basic";

// 扩展 AxiosRequestConfig 类型
interface CustomAxiosRequestConfig extends AxiosRequestConfig {
  isNotTipErrorMsg?: boolean;
}

// 扩展 InternalAxiosRequestConfig 类型
interface CustomInternalAxiosRequestConfig extends InternalAxiosRequestConfig {
  isNotTipErrorMsg?: boolean;
}

// 扩展 AxiosResponse 类型
interface CustomAxiosResponse extends AxiosResponse {
  config: CustomInternalAxiosRequestConfig;
}


// 创建一个axios 请求实例
const service = axios.create({
  baseURL: import.meta.env.VITE_APP_BASE_URL,
  timeout: 8000,
});
// 保存请求的地址 - 用于取消请求
let tempReqUrlSave = ''
// let loadingInstance: any = null //loading实例
const authorTipDoor = true



// 请求前拦截
service.interceptors.request.use(
  (req: CustomInternalAxiosRequestConfig) => {
    const { token, axiosPromiseArr } = useBasicStore();
    // axiosPromiseArr 手机请求地址，用于取消请求
    req.cancelToken = new axios.CancelToken(c => {
      // 这里的req.url是请求地址
      if (!req.url) return false;
      tempReqUrlSave = req.url
      axiosPromiseArr.push({
        url: req.url,
        cancel: c
      })
    })

    // if(token) req.headers.Authorization = `Bearer ${token}`
    // 添加token到header
    if (token) req.headers.Authorization = token

    // @TODO 是否数据加载中 req.reqLoading
    // loadingInstance = Loading.service({})

    return req
  },
  err => {
    // 请求失败
    Promise.reject(err)
  }
)


// 请求后拦截
service.interceptors.response.use(
  (res: CustomAxiosResponse) => {
    // 取消请求

    // 关闭加载窗

    //download file
    if (res.data?.type?.includes("sheet")) {
      return res
    }

    const { code, msg } = res.data
    const successCode = '0,200,2000'
    const noAuthCode = '401,403'
    if (successCode.includes(code)) {
      return res.data
    } else {
      //authorTipDoor 防止多个请求 多次alter
      if (authorTipDoor) {
        if (noAuthCode.includes(code)) {
          // 重新登录
        } else {
          // 是否 不 需要错误提示？ !res.config?.isNotTipErrorMsg
          if (!res.config?.isNotTipErrorMsg) {
            // 错误提示？
          } else {
            return res
          }

          return Promise.reject(msg)
        }
      }
    }

  },
  // 响应报错
  err => {
    // 取消请求
    // 关闭加载弹窗
    // 错误提示？
    return Promise.reject(err)
  }
)

//导出service实例给页面调用 , config->页面的配置
export default function axiosReq(config: CustomAxiosRequestConfig) {
  return service(
    {
      ...config
    }
  )
}
